package cn.itcast.service.impl;

import cn.itcast.dao.IGoodsDao;
import cn.itcast.domain.Goods;
import cn.itcast.service.IGoodsService;
import cn.itcast.service.IPersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

@Service("goodsService")
public class GoodsServiceImpl implements IGoodsService {

    @Autowired
    private IGoodsDao goodsDao;

    @Autowired
    private IPersonService personService;

    @Autowired
    RedisTemplate redisTemplate;
    /**
     * 查询所有捐赠物资
     * @return
     */
    @Override
    public List<Goods> findAllDonateGoods() {
        List<Goods> goodsList = goodsDao.findAllDonateGoods();
        // 将查出的物资放入redis缓存
        for(Goods goods : goodsList){
            redisTemplate.opsForHash().put("donateGoods",goods.getId().toString(),goods);
        }
        return goodsList;
    }

    /**
     * 根据id查询捐赠物资
     * @param id
     * @return
     */
    @Override
    public Goods findDonateGoodsById(Integer id) {
        Goods donateGoods ;
        if(redisTemplate.opsForHash().hasKey("donateGoods",id.toString())){
            //redis缓存中含有该物资
            System.out.println("在redis中查找");
            donateGoods = (Goods) redisTemplate.opsForHash().get("donateGoods",id.toString());
        }else {
            //redis缓存中不含该物资，从mysql中获取
            donateGoods = goodsDao.findDonateGoodsById(id);
            //将物资放入redis缓存
            redisTemplate.opsForHash().put("donateGoods",id.toString(),donateGoods);
        }
        return donateGoods;
    }

    /**
     * 插入捐赠物资
     * @param goods
     * @return
     */
    @Override
    public void insertDonateGoods(Goods goods) {

        //先插入捐赠者
        String insertedDonatorId = personService.insertDonator(goods.getPerson().getName());

        //插入物资
        goodsDao.insertDonateGoods(goods);
        Integer insertedDonateGoodsId = goods.getId();

        //将id对插入物资-捐赠者表格
        goodsDao.insertDonateIdPair(insertedDonateGoodsId,insertedDonatorId);

        //设置插入物资id
        goods.setId(insertedDonateGoodsId);
        //将插入的新物资放入redis缓存
        redisTemplate.opsForHash().put("donateGoods",insertedDonateGoodsId.toString(),goods);
    }

    /**
     * 更新捐赠物资
     * @param goods
     */
    @Override
    public void updateDonateGoods(Goods goods) {
        goodsDao.updateDonateGoods(goods);
        //更新redis缓存
        redisTemplate.opsForHash().put("donateGoods",goods.getId().toString(),goods);
    }

    /**
     * 删除捐赠物资
     * @param id
     */
    @Override
    public void deleteDonateGoods(Integer id) {
        // 根据捐赠物资id查找捐赠者i d
        Integer donatorId = goodsDao.findDonatorIdByDonateGoodsId(id);
        // donate_goods表中删除该物资
        goodsDao.deleteDonateGoodsById(id);
        // donator_with_goods表中删除该关联项
        goodsDao.deleteDonateIdPair(id);
        // 从donator_with_goods表中查找捐赠者id是否还存在
        Integer donatorNum = goodsDao.findDonatorCountById(donatorId);
        if(donatorNum == 0) {
            //若否，则删除donator表中的该捐赠者
            personService.deleteDonatorById(donatorId.toString());
        } else{
            //若是，则不做处理
            return ;
        }
        // 从redis缓存中删除物资
        redisTemplate.opsForHash().delete("donateGoods",id.toString());
    }

    /**
     * 查询所有接收物资
     * @return
     */
    @Override
    public List<Goods> findAllRecieveGoods() {
        List<Goods> goodsList =  goodsDao.findAllRecieveGoods();
        for(Goods goods : goodsList){
            redisTemplate.opsForHash().put("recieveGoods",goods.getId().toString(),goods);
        }
        return goodsList;
    }

    /**
     * 根据id查找接收物资
     * @param id
     * @return
     */
    @Override
    public Goods findRecieveGoodsById(Integer id) {
        Goods recieveGoods;
        if(redisTemplate.opsForHash().hasKey("recieveGoods",id.toString())){
            // redis缓存中含有该物资
            System.out.println("在redis中查询");
            recieveGoods = (Goods) redisTemplate.opsForHash().get("recieveGoods",id.toString());
        } else{
            // redis缓存中不含该物资，从mysql中查找
            recieveGoods = goodsDao.findRecieveGoodsById(id);
            // 将物资放入redis缓存
            redisTemplate.opsForHash().put("recieveGoods",id.toString(),recieveGoods);
        }
        return recieveGoods;
    }

    /**
     * 插入接收物资
     * @param goods
     */
    @Override
    public void insertRecieveGoods(Goods goods) {

        //先插入接收者
        String insertedRecieverId = personService.insertReciever(goods.getPerson().getName());

        //插入物资
        goodsDao.insertRecieveGoods(goods);
        Integer insertedRecieveGoodsId = goods.getId();

        //将id对插入物资-捐赠者表格
        goodsDao.insertRecieveIdPair(insertedRecieveGoodsId,insertedRecieverId);

        //设置插入物资id
        goods.setId(insertedRecieveGoodsId);
        //将插入的新物资放入redis缓存
        redisTemplate.opsForHash().put("recieveGoods",insertedRecieveGoodsId.toString(),goods);
    }

    /**
     * 更新接收物资
     * @param goods
     */
    @Override
    public void updateRecieveGoods(Goods goods) {
        goodsDao.updateRecieveGoods(goods);
        //更新redis缓存
        redisTemplate.opsForHash().put("recieveGoods",goods.getId().toString(),goods);
    }

    /**
     * 删除接受物资
     * @param id
     */
    @Override
    public void deleteRecieveGoods(Integer id) {
        // 1.根据接收物资id查找接收者id
        Integer recieverId = goodsDao.findRecieverIdByRecieveGoodsId(id);
        // 2.donate_goods表中删除该物资
        goodsDao.deleteRecieveGoodsById(id);
        // 3.donator_with_goods表中删除该关联项
        goodsDao.deleteRecieveIdPair(id);
        // 4.从donator_with_goods表中查找捐赠者id是否还存在
        Integer donatorNum = goodsDao.findRecieveCountById(recieverId);
        if(donatorNum == 0) {
            //若否，则删除donator表中的该捐赠者
            personService.deleteRecieverById(recieverId.toString());
        } else{
            //若是，则不做处理
            return ;
        }
        // 从redis缓存中删除物资
        redisTemplate.opsForHash().delete("recieveGoods",id.toString());
    }

    /**
     * 模糊查询捐赠物资
     * @param key
     * @return
     */
    @Override
    public List<Goods> findDonateGoodsByKey(String key) {
        return goodsDao.findDonateGoodsByKey(key);
    }

    /**
     * 模糊查询接收物资
     * @param key
     * @return
     */
    @Override
    public List<Goods> findRecieveGoodsByKey(String key) {
        return goodsDao.findRecieveGoodsByKey(key);
    }
}
